home *** CD-ROM | disk | FTP | other *** search
- /***************************************************************************/
- /* VISUALIZADOR de PANTALLAS .PCX de 640x480 de 16 colores */
- /* */
- /* por: José Antonio Acedo Martín-Grande, miembro de "GOLDY GAMES" */
- /* */
- /* TEL: 6 11 72 71 (MADRID pref. 91) */
- /***************************************************************************/
-
- #include <dos.h> /* cabeceras que hacen que se incluyan */
- #include <alloc.h>
- #include <conio.h> /* durante el proceso de compilado */
- #include <stdio.h> /* las funciones que el programa utilize */
- #include <stdlib.h>
-
- /******************************* DEFINICIONES ******************************/
-
- #define ALFANUMERICO 3 /* el compilador cambia la palabra por */
- #define GRAFICO 18 /* su número en el proceso de compilación */
-
- /*********************** DECLARACIONES DE FUNCIONES ************************/
-
- void asigna_modo_video(char); /* definición del tipo de funciones que */
- void asigna_memoria(void); /* se usarán en el programa. Se indica el */
- void libera_memoria(void); /* tipo de dato que devuelven y el tipo */
- void lee_dibujo(void); /* de dato/s que necesitan que se les */
- void comprueba_dibujo(void); /* pase para funcionar. */
- void prepara_pantalla(void);
- void descomprime_dibujo(void);
- void asigna_rgb(void);
- void VUELCA_PANTALLA(unsigned char *);
-
- /*************************** VARIABLES GLOBALES ****************************/
-
- unsigned char *dir_planos;
- unsigned char *dir_dibujo;
- char dibujo[80];
- char bits_pixel;
- char num_planos;
- int colores[16] = { 0, 1, 2, 3, 4, 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63 };
- int ancho;
- int alto;
- int tecla;
- FILE *handle_dibujo;
-
- /************************** COMIENZO DEL LISTADO ***************************/
-
- void main(void)
- /***************************************************************************/
- /* Este es el núcleo del programa. Desde aquí se llama a todas las */
- /* funciones. Primero se asigna la dirección de comienzo de la zona de */
- /* pantalla a "dir_pantalla". Seguidamente se dibuja en la pantalla de */
- /* texto los mensajes y cabeceras para que quede bonita. */
- /* NOTA: Las funciones que se han utilizado para presentar texto en */
- /* color pueden no ser compatibles con tu compilador, si te dan problemas */
- /* omite la función: "dibuja_presentacion()" o intenta sustituir estas */
- /* funciones por su equivalente en tu compilador. */
- /* Seguidamente la función: "gets()" espera a la entrada del nombre */
- /* del fichero desde el teclado. Hecho esto se reserva memoria para */
- /* cargar el dibujo solicitado mediante la función: "asigna_memoria()". */
- /* Entonces la función: "lee_dibujo()" lo carga en memoria. La función: */
- /* "comprueba_dibujo()" se encarga de comprobar que el dibujo tenga el */
- /* formato solicitado y no exceda en dimensiones. Si todo es correcto se */
- /* asignará el modo de vídeo VGA mediante la función:"asigna_modo_video()"*/
- /* y se descomprimirá el dibujo con la función: "descomprime_dibujo()", */
- /* a la vez que se visualiza en pantalla. */
- /* El dibujo permanecerá en pantalla hasta que pulsemos una tecla. */
- /* Entonces se reestablecerá el modo de vídeo alfanumérico y se devolverá */
- /* al sistema operativo la memoria que fue asignada con la función: */
- /* "libera_memoria()", y el programa devolverá el control al DOS. */
- /***************************************************************************/
- {
- prepara_pantalla(); /* prepara la pantalla */
- gotoxy(14,7); /* coloca el cursor */
- textcolor(LIGHTGREEN); /* pone tinta a verde brill. */
- cprintf("Introduce el nombre de un fichero .PCX y pulsa ENTER:\n");
- gotoxy(34,19); /* coloca el cursor */
- gets(dibujo); /* pide el nombre del dibujo */
- asigna_memoria(); /* reserva memoria al dibujo */
- lee_dibujo(); /* lee el dibujo del disco */
- comprueba_dibujo(); /* ve si formato es adecuado */
- asigna_modo_video(GRAFICO); /* activa el modo gráfico */
- descomprime_dibujo(); /* descomprime el dibujo */
- VUELCA_PANTALLA(dir_planos); /* visualiza el dibujo */
- tecla=getch(); /* espera hasta pulse tecla */
- asigna_modo_video(ALFANUMERICO); /* activa modo alfanumérico */
- libera_memoria(); /* devuelve la memoria al DOS*/
- } /* vuelve al DOS */
-
- void prepara_pantalla(void)
- {
- int x;
-
- textbackground(BLUE);
- clrscr();
- gotoxy(12,3);
- textcolor(WHITE);
- cprintf("VISUALIZADOR DE PANTALLAS .PCX DE 640 X 480 DE 16 COLORES");
- gotoxy(11,5);
- textcolor(YELLOW);
- cprintf("╔══════════════════════════════════════════════════════════╗");
- for(x=6; x<21; ++x) {
- gotoxy(11,x); cprintf("║"); gotoxy(70,x); cprintf("║");
- }
- gotoxy(11,x);
- cprintf("╚══════════════════════════════════════════════════════════╝");
- textcolor(LIGHTCYAN);
- gotoxy(2,25); cprintf("GOLDY GAMES 1995");
- gotoxy(48,25); cprintf("JOSE ANTONIO ACEDO MARTIN-GRANDE");
- }
-
- void asigna_modo_video(char modo) /* asigna el modo de vídeo indicado */
- { /* en la variable "modo" */
- union REGS r;
-
- r.h.al = modo;
- r.h.ah = 0;
- int86(16, &r, &r);
- }
-
- void asigna_memoria(void) /* reserva memoria para cargar el dibujo */
- {
- if((dir_dibujo=(unsigned char *)farmalloc(153600))==NULL) {
- asigna_modo_video(ALFANUMERICO);
- printf("No hay suficiente memoria. Libera programas residentes.");
- exit(1);
- }
- if((dir_planos=(unsigned char *)farmalloc(153600))==NULL) {
- asigna_modo_video(ALFANUMERICO);
- printf("No hay suficiente memoria. Libera programas residentes.");
- exit(1);
- }
- }
-
- void libera_memoria(void) /* libera la memoria asignada al DOS */
- {
- farfree(dir_dibujo);
- farfree(dir_planos);
- }
-
- void lee_dibujo(void)
- {
- int *dir_dibu;
- char huge *dir;
-
- if((handle_dibujo=fopen(dibujo, "rb"))==NULL) {
- asigna_modo_video(ALFANUMERICO);
- printf("No se encontró el dibujo solicitado.");
- exit(1);
- }
-
- dir=(char huge *)dir_dibujo;
- while(!feof(handle_dibujo)) { *dir++=getc(handle_dibujo); }
-
- if(fclose(handle_dibujo)!=NULL) {
- asigna_modo_video(ALFANUMERICO);
- printf("No se pudo cerrar el archivo.");
- exit(1);
- }
-
- dir_dibu=(int *)dir_dibujo;
- bits_pixel=*(dir_dibujo+3);
- num_planos=*(dir_dibujo+65);
- ancho=1+(*(dir_dibu+4));
- alto =1+(*(dir_dibu+5));
- }
-
- void comprueba_dibujo(void)
- {
- if(*dir_dibujo!=10) {
- asigna_modo_video(ALFANUMERICO);
- printf("Este fichero no es un dibujo .PCX."); /* comprueba que el */
- exit(1); /* dibujo sea .PCX */
- }
- if(bits_pixel!=1 || num_planos!=4) { /* comprueba que el */
- asigna_modo_video(ALFANUMERICO); /* dibujo tenga 16 */
- printf("El dibujo no tiene 16 colores."); /* colores */
- exit(1);
- }
-
- if(ancho>640 || alto>480) { /* comp. el tamaño */
- asigna_modo_video(ALFANUMERICO);
- printf("El dibujo no cabe en la pantalla. Intenta reducirlo.");
- exit(1);
- }
- }
-
- void descomprime_dibujo(void)
- {
- unsigned char huge *dir_lectura;
- unsigned char huge *dir_escritura;
- unsigned char byte;
- int columnas, filas, contador;
-
- dir_lectura =dir_dibujo+128; /* inicio del dibujo comprimido */
- dir_escritura=dir_planos;
-
- for(filas=alto; filas>0; filas--) {
- columnas=ancho/2;
- while(columnas>0) {
- byte=*dir_lectura++;
- if(byte<=192) { *dir_escritura++=byte; columnas--; }
- else {
- contador=byte&0x3F; byte=*dir_lectura++;
- for(; contador>0; contador--) {
- *dir_escritura++=byte; columnas--;
- }
- }
- }
- }
- asigna_rgb();
- }
-
- void asigna_rgb(void)
- {
- struct SREGS seg;
- union REGS ent, sal;
- int num_color, n;
- long int dir;
- unsigned char *dir_col;
-
- dir_col=dir_dibujo+16; /* divide entre 4 */
- for(n=16*3; n>0; n--) { /* los colores */
- *dir_col=(*dir_col) >> 2; dir_col++;
- }
-
- dir =(long)(dir_dibujo+16); /* obtiene el segmento */
- seg.es=(int) (dir >> 16); /* donde estan los colores */
-
- for(n=0; n<16; n++) {
- num_color=colores[n];
- ent.h.al = 18;
- ent.h.ah = 16;
- ent.x.bx = num_color;
- ent.x.cx = 1;
- ent.x.dx = (int)dir; /* offset de los colores */
- int86x(0x10, &ent, &sal, &seg); /* función para asignar los colores */
- dir+=3;
- }
- }